跳至主要内容

LLM 邊緣部署與優化搭配 llama.cpp

在邊緣 AI 平台上使用 llama.cpp 部署和優化大語言模型的完整指南。


使用案例

應用:邊緣 AI 設備(NVIDIA Jetson、Intel x86 等)上的 LLM 推論

背景

  • 客戶需求:在邊緣平台上改善 LLM 推論速度
  • 平台:ASR-A702 / NVIDIA Jetson Thor
  • 模型:透過 llama.cpp 的 Qwen3.6
  • 挑戰:輸出速度 46 t/s(每秒 token 數)影響使用者體驗

背景分析

為什麼邊緣 AI 用於 LLM?

在邊緣設備上運行 LLM 提供顯著優勢:

優點

  • ✅ 低延遲推論(無需網路往返)
  • ✅ 隱私和資料安全(本地處理)
  • ✅ 離線能力(無需網際網路)
  • ✅ 成本效益(減少雲端成本)
  • ✅ 可擴展性(分散式部署)

llama.cpp 與 Ollama 比較

llama.cpp 與 Ollama 比較 compare_llama_ollama

💡 注意:此比較強調了 llama.cpp 和 Ollama 在邊緣部署場景中的架構和性能差異。

性能背景

每秒 token 數(t/s)

  • 人類閱讀速度:15-20 t/s
  • 目前系統:48 t/s(人類閱讀速度的 2 倍)
  • 目標:優化以提供更好的使用者體驗

邊緣 vs 雲端

  • 邊緣設備推論 ≠ 雲端多 GPU 資料中心
  • 目標:系統性地測試設定如何影響推論速度

實施步驟

步驟 1:驗證 GPU 加速

先決條件

  • 已安裝 NVIDIA JetPack SDK
  • 已啟用 CUDA 加速
  • 正確配置 GPU 驅動

驗證

# 檢查 JetPack 版本
cat /etc/nv_tegra_release

# 檢查 GPU 狀態
nvidia-smi

# 驗證 CUDA 可用性
/usr/local/cuda/bin/nvcc --version

步驟 2:下載並編譯 llama.cpp

需求

  • 已啟用 CUDA 支援
  • CMake 建置系統
  • 具有計算能力 ≥ 7.0 的 NVIDIA GPU

建置程序

# 複製 llama.cpp 儲存庫
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp

# 使用 CUDA 支援配置
mkdir build && cd build
cmake .. -DLLAMA_CUDA=ON -DCMAKE_CUDA_COMPILER=/usr/local/cuda/bin/nvcc
make -j$(nproc)

輸出二進位檔案

  • llama-cli:互動式推論介面
  • llama-bench:性能基準測試工具
  • llama-server:用於 API 訪問的 HTTP 伺服器

步驟 3:下載 GGUF 模型

從 huggingface 下載模型,我們使用 unsloth/Qwen3.6-35B-A3B-GGUF 作為範例。

下載 huggingface

步驟 4:執行基準測試(客戶參數)

基準測試

./build/bin/llama-bench \
-m ./Qwen3.6-35B-A3B-MXFP4_MOE.gguf \
-ngl 99 \ # 將所有層卸載到 GPU
-fa 1 \ # 啟用 flash attention
-ub 2048 -b 4096 \
-t 12 \ # 12 個執行緒(可用 14 個核心)
--cache-type-k q8_0 --cache-type-v q8_0 \
-p 512,1024,2048,4096,8192,16284,32768 \
-n 128,256,512,1024,2048

結果

  • 初始吞吐量:約 48 t/s
  • 系統穩定運行但性能受限

基準測試

步驟 5:熱管理 - 風扇全速

動作

  • 將風扇速度設置為 100% 最大
  • 監控熱降頻狀態

驗證

$ sudo systemctl disable nvfancontrol.service
$ sudo systemctl stop nvfancontrol
$ sudo su //密碼是 ubuntu
$ echo 0 > /sys/class/hwmon/hwmon2/pwm1

步驟 6:鎖定到最大性能模式

性能配置

# 啟用最大性能模式
sudo nvpmodel -m 0

# 鎖定 CPU 和 GPU 頻率
sudo jetson_clocks

性能模式

步驟 7:執行模型推論(llama-cli)

優化執行

./build/bin/llama-cli -m ~/Downloads/Qwen3.6-35B-A3B-MXFP4_MOE.gguf \
-ngl 99 \
-fa 1 \
-ub 2048 \
-b 4096 \
-t 12 \
--cache-type-k q8_0 --cache-type-v q8_0 \
-n 512 \
-p "what's up"

結果

  • 基準:約 48 t/s(伴隨熱降頻)
  • 性能模式後:約 52 t/s(提升 8%)

性能比較

步驟 8:啟動 Web UI(llama-server)

伺服器設置

./build/bin/llama-server \
-m ~/Downloads/Qwen3.6-35B-A3B-MXFP4_MOE.gguf \
-ngl 99 \
-fa 1 \
-ub 2048 \
-b 4096 \
-t 12 \
--cache-type-k q8_0 \
--cache-type-v q8_0 \
--ctx-size 8192 \
--host 0.0.0.0 \
--port 8080

從瀏覽器存取

http://localhost:8080

Web UI


結論

關鍵發現

基準已重現

  • ✅ 確認約 48 t/s
  • ✅ 在邊緣設備上達到人類閱讀速度的 2 倍,這不是使用者體驗問題

硬體配置

  • 風扇 100% + MAX 性能模式(nvpmodel -m 0)+ 鎖定時鐘(jetson_clocks)
  • 吞吐量:52 t/s — 比基準提升 8%

建議

  1. 熱管理至關重要

    • 確保持續性能所需的充分散熱
    • 在推論期間使用最大風扇速度
    • 監控熱降頻指標
  2. 性能模式鎖定

    • 始終使用 nvpmodel -m 0 獲得最大性能
    • 套用 jetson_clocks 鎖定頻率

參考


← 返回 解決方案 總覽